import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;

import Utils.FileUtil;
import Utils.HashUtil;
import Utils.ListUtil;
import Utils.RETool;
import Utils.MathUtil;

public class Location {
	// 抽取地点
	public static ArrayList<String> extractLocation(String string) {
		ArrayList<String> result = new ArrayList<String>();
		String locations = "";
		String locationPath1 = "c:/weibo/wordlist/locations.txt";
		String locationPath2 = "c:/weibo/wordlist/locations_china.txt";
		String locationPath3 = "c:/weibo/wordlist/locations_oversea.txt";
		String locationContent1 = FileUtil.readFile(locationPath1, "utf-8");
		String locationContent2 = FileUtil.readFile(locationPath2, "utf-8");
		String locationContent3 = FileUtil.readFile(locationPath3, "utf-8");
		for (String location : locationContent1.split("\n"))
			locations += location + "|";
		for (String location : locationContent2.split("\n"))
			locations += location + "|";
		for (String location : locationContent3.split("\n"))
			locations += location + "|";
		locations = locations.substring(0, locations.length() - 1);

		ArrayList<String> expressions = new ArrayList<String>();
		expressions.add("(" + locations + ")");
		expressions.add("[\\d]+号线");
		expressions.add("[\\d]+路");
		expressions.add("我在:http://[\\w]+.[\\w]+(/[\\w]*)*");

		System.out.println("(" + locations + ")*");

		for (int i = 0; i < expressions.size(); i++) {
			ArrayList<String> tmp = RETool.extract(string, expressions.get(i));
			result = ListUtil.merge(result, tmp);
		}

		return result;
	}

	// type==1,term;type==2,pos
	public static void getLVectorByTerms(String content, List<String> terms, List<String> poses, int type) { // 归一化左侧pos向量
		Hashtable<String, Integer> lPOSByPOS = NLPTools.extractLByPOS(content, poses, type);
		List<String> LPOSListByPOS = new ArrayList<String>();
		Enumeration<String> en = lPOSByPOS.keys();
		while (en.hasMoreElements()) {
			LPOSListByPOS.add(en.nextElement());
		}
		Hashtable<String, Integer> lPOSByTerms = NLPTools.extractLByTerms(content, terms, type);
		HashUtil.normalizeHash(LPOSListByPOS, lPOSByTerms);

	}

	// type==1,term;type==2,pos
	public static void getRVectorByTerms(String content, List<String> terms, List<String> poses, int type) { // 归一化左侧pos向量
		Hashtable<String, Integer> rPOSByPOS = NLPTools.extractRByPOS(content, poses, type);
		List<String> rPOSListByPOS = new ArrayList<String>();
		Enumeration<String> en = rPOSByPOS.keys();
		while (en.hasMoreElements()) {
			rPOSListByPOS.add(en.nextElement());
		}
		Hashtable<String, Integer> rPOSByTerms = NLPTools.extractRByTerms(content, terms, type);
		HashUtil.normalizeHash(rPOSListByPOS, rPOSByTerms);

	}

	// type==1,term;type==2,pos
	public static void getLRVectorByTerms(String content, List<String> terms, List<String> poses, int type) { // 归一化左侧pos向量
		Hashtable<String, Integer> lrPOSByPOS = NLPTools.extractLRByPOS(content, poses, type);
		List<String> lrPOSListByPOS = new ArrayList<String>();
		Enumeration<String> en = lrPOSByPOS.keys();
		while (en.hasMoreElements()) {
			lrPOSListByPOS.add(en.nextElement());
		}
		Hashtable<String, Integer> lrPOSByTerms = NLPTools.extractLRByTerms(content, terms, type);
		HashUtil.normalizeHash(lrPOSListByPOS, lrPOSByTerms);

	}

	public static void main(String args[]) {
		// String sentence =
		// "他可烦他山西，你是一个深圳人，你是一个北京人,我是一个中国人，你是一个韩国人,他是一个日本人,他是一个青岛人，他是一个吉林人，他是一个上海人，他是一个加州人,我觉得深圳很美,我觉得日本很美,我觉得韩国很美";
		String sentence = "终于找到这首歌了， 不容易...13号线广播里听到的北京发最低级别暴雨预警 全城“躲雨”】7月25日，中央气象台发布了最低级别的暴在学校办事儿真可以锻炼身体，来来回回科技处跑了七八趟，事情没搞定提前到了，只能在KFC坐等你家糖果先生千里迢迢给哥送来的鸡，u good～～ 我在:http://t.cn/zWQvlUQ燥热的雨夜，没有什么比站在阳台上喝汽水更惬意的了。 我在:http://t.cn/zWj9rw4突然好想吃一碗黔江燕燕小吃的手工面哟。 从延庆回来了，县城不大却非常干净整洁，是个好地方！2006年的首都机场，这个画面曾经那么鲜活第一次去到派出所做证人录了笔录。 一个东北口音的男子在693路公交车上无故辱骂售票员，脚踹售票台和座椅，忍无可忍之下售票员只好报警。刚刚整理文件的时候，发现了我们念大学的时候的照片单位门口，还好今天是周末 //@gladelu:在这里吃过面真的看不得这种事情，有路过新桥医院的朋友就去贡献一点爱心吧。第一次去音乐厅听的便是久石让的千与千寻。明明姐专程从香港飞来台北，为我在台北《风华绝代》演出捧场。我去机场接她，应邀送给郑明明@monita 《风华.刘晓庆》限量版画册。谢谢明明姐！8月27日，话剧《风华绝代》剧组登陆台湾。在当天下午新闻发布会上，《风华刘晓庆》限量版画册首发式同时举行。我将001号画册赠送给台北主办方陈琪。今天晚上7点半，传奇话剧《风华绝代》在台北首轮演出将在国父纪念馆拉开序幕。飞！回北京。太特儿……好啦！最喜欢加州的阳光分享图片：在旧金山，应邀去朋友家里作客。和美国朋友们在美国一起吃西餐，一起骂美国。钓鱼岛的事情上，美国太不象话了。钓鱼島祖祖辈辈都是中国的，关美国屁事，他插一棍子算什么？还和日本一起军演给中国看，这副国际警察的面孔真讨厌。沈阳火车站。去大连";
		System.out.println(sentence);
		List<String> terms = new ArrayList<String>();
		terms.add("北京");
		terms.add("上海");
		terms.add("深圳");
		terms.add("台湾");
		terms.add("加州");
		List<String> poses = new ArrayList<String>();
		poses.add("ns");
		poses.add("n");

		// getLVectorByTerms(sentence, terms, poses, 1);
		// getLVectorByTerms(sentence, terms, poses, 2);
		// getRVectorByTerms(sentence, terms, poses, 1);
		// getRVectorByTerms(sentence, terms, poses, 2);
		// getLRVectorByTerms(sentence, terms, poses, 1);
		// getLRVectorByTerms(sentence, terms, poses, 2);

		// 目标：从文本中学出和"北京，上海"相似的"ns"
		// 算"北京，上海"lPOS vector
		Hashtable<String, Integer> ht1 = NLPTools.extractLByTerms(sentence, terms, 2);
		HashUtil.printHash(ht1);

		// 算ns的lPOS vector
		Hashtable<String, Integer> ht2 = NLPTools.extractLByPOS(sentence, poses, 2);
		HashUtil.printHash(ht2);

		// 计算出所有的命中词
		List<String> hits = NLPTools.extractHits(sentence, poses, 1);
		for (String hit : hits) {
			// 算符合词性的某词的lPOS vector
			Hashtable<String, Integer> ht3 = NLPTools.extractLByTerm(sentence, hit, 2);
			int result = 0;
			Enumeration<String> en1 = ht1.keys();
			while (en1.hasMoreElements()) {
				String key = en1.nextElement();
				if (ht3.containsKey(key))
					result += ht1.get(key) * ht3.get(key);

			}
			System.out.println(hit + ":" + result);
		}
	}
}
